#include "../logs/dhylog.hpp"
#include<vector>
#include<thread>
#include<chrono>

void bench(const std::string &logger_name,size_t thr_count,size_t msg_count,size_t msg_len)
{
    dhylog::Logger::ptr logger=dhylog::getLogger(logger_name);
    if(logger.get()==nullptr)
    {
        return;
    }
    std::cout<<"测试日志："<<msg_count<<"条，总大小:"<<(msg_count*msg_len)/1024<<"kb\n";
    std::string msg(msg_len-1,'A');
    std::vector<std::thread> threads;
    std::vector<double> cost_arry(thr_count);
    size_t msg_per_thr=msg_count/thr_count;
    for(int i=0;i<thr_count;i++)
    {
        threads.emplace_back([&,i]()
        {
            auto start=std::chrono::high_resolution_clock::now();
            for(int j=0;j<msg_per_thr;j++)
            {
                logger->fatal("%s",msg.c_str());
            }
                auto end=std::chrono::high_resolution_clock::now();
                std::chrono::duration<double> cost=end-start;
                cost_arry[i]=cost.count();
                std::cout<<"线程"<<i<<":"<<"\t输出数量"<<msg_per_thr<<",耗时："<<cost.count()<<"s"<<std::endl;
            
        });
    }
    for(int i=0;i<thr_count;i++)
    {
        threads[i].join();
    }
    double max_cost=cost_arry[0];
    for(int i=0;i<thr_count;i++) max_cost=max_cost<cost_arry[i]? cost_arry[i]:max_cost;
    size_t msg_per_sec=msg_count/max_cost;
    size_t size_per_sec=(msg_count*msg_len)/(max_cost*1024);
    std::cout<<"\t总耗时:"<<max_cost<<"s\n";
    std::cout<<"\t每秒输出日志数量:"<<msg_per_sec<<"条\n";
    std::cout<<"\t每秒输出日志大小:"<<size_per_sec<<"KB\n";
}
void sync_bench()
{
    std::unique_ptr<dhylog::LoggerBuilder> builder(new dhylog::GlobalLoggerBuilder());
    builder->buildLoggerName("sync_logger");
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(dhylog::LoggerType::LOGGER_SYNC);
    builder->buildSink<dhylog::FileSink>("./logfile/sync.log");
    builder->build();
    bench("sync_logger",1,1000000,100);

}
void async_bench()
{
    std::unique_ptr<dhylog::LoggerBuilder> builder(new dhylog::GlobalLoggerBuilder());
    builder->buildLoggerName("async_logger");
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(dhylog::LoggerType::LOGGER_ASYNC);
    builder->buildEnableUnSafeAsync();
    builder->buildSink<dhylog::FileSink>("./logfile/async.log");
    builder->build();
    bench("async_logger",3,1000000,100);

}
int main()
{
    //sync_bench();
    async_bench();
    return 0;
    
}